package com.yunxin.mybatisplus.utils.datahandler;



import lombok.Data;

import java.io.Serializable;

/**
 * description: 统一返回封装类
 *
 * @author sbx
 * @create 2024/8/6 10:30
 */
@Data
public class HttpResult<T> implements Serializable {
    private static final long serialVersionUID = 1111111117L;

    /**
     * 是否响应成功
     */
    private Boolean success;
    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 响应数据
     */
    private T data;
    /**
     * 消息
     */
    private String message;


    /**
     * 响应成功无返回值的构造函数
     */
    private HttpResult() {
        this.code = 200;
        this.success = true;
    }
    /**
     * 响应成功返回数据的构造函数
     * @param obj
     */
    private HttpResult(T obj) {
        this.code = 200;
        this.data = obj;
        this.success = true;
    }

    /**
     * 响应成功，返回数据和消息的构造函数
     * @param obj
     * @param message
     */
    private HttpResult(T obj, String message) {
        this.code = 200;
        this.data = obj;
        this.success = true;
        this.message = message;
    }

    /**
     * 全部参数的构造函数，
     *
     * @param flag
     * @param obj
     * @param code
     * @param message
     */
    private HttpResult(boolean flag, T obj, Integer code, String message) {
        this.success = flag;
        this.data = obj;
        this.code = code;
        this.message = message;
    }

    /**
     * 响应失败返回统一返回码的构造函数
     * @param resultCode
     */
    private HttpResult(ResultCodeEnum resultCode) {
        this.success = false;
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
    }
    // 构造器结束

    /**
     * 通用返回成功（没有返回结果）
     * @param <T>
     * @return
     */
    public static<T> HttpResult<T> success(){
        return new HttpResult();
    }

    /**
     * 返回成功（有返回结果）
     * @param data
     * @param <T>
     * @return
     */
    public static<T> HttpResult<T> success(T data){
        return new HttpResult<T>(data);
    }

    /**
     * 返回成功（有返回结果和消息）
     * @param data
     * @param <T>
     * @return
     */
    public static<T> HttpResult<T> success(T data, String message){
        return new HttpResult<T>(data,message);
    }

    /**
     * 通用返回失败(返回统一返回码)
     * @param resultCode
     * @param <T>
     * @return
     */
    public static<T> HttpResult<T> failure(ResultCodeEnum resultCode){
        return  new HttpResult<T>(resultCode);
    }

    /**
     * 通用返回失败(返回自定义消息)
     *
     * @param message
     * @param <T>
     * @return
     */
    public static<T> HttpResult<T> failure(String message){
        return new HttpResult<T>(false,null,500,message);
    }


    /**
     * 自定义返回结果(暴露给使用者自定义返回结果)
     *
     * @param code
     * @param message
     * @param <T>
     * @return
     */
    public static <T> HttpResult<T> newResult(boolean flag, T obj, Integer code, String message) {
        return new HttpResult<T>(flag, obj, code, message);
    }


}

